package br.com.gestacard.sync.entidade;

import java.math.BigDecimal;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToMany;

import org.hibernate.annotations.ForeignKey;

@MappedSuperclass
public abstract class Formulario extends AppBaseEntity {

	private static final long serialVersionUID = 2400783875091039111L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "SE_FORMULARIO")
	@Column(name = "ID_FORMULARIO", nullable = false, length = 6)
	private Long id;

	@ManyToOne(targetEntity = InstituicaoEntity.class, fetch = FetchType.LAZY)
	@ForeignKey(name = "FK_FORMULARIO_INSTITUICAO")
	@JoinColumn(name = "ID_INSTITUICAO", nullable = false)
	private Instituicao instituicao;

	@ManyToOne(targetEntity = CoordenadorEntity.class, fetch = FetchType.LAZY)
	@ForeignKey(name = "FK_FORMULARIO_COORDENADOR")
	@JoinColumn(name = "ID_COORDENADOR", nullable = false)
	private Coordenador coordenador;

	@ManyToOne(targetEntity = ContaCorrenteEntity.class, fetch = FetchType.LAZY)
	@ForeignKey(name = "fk_comprdeposito_coordenador")
	@JoinColumn(name = "ID_CONTA_CORRENTE", nullable = false)
	private ContaCorrente contaCorrente;

	@ManyToOne(targetEntity = ProdutoEntity.class, fetch = FetchType.LAZY)
	@ForeignKey(name = "FK_FORMULARIO_PRODUTO")
	@JoinColumn(name = "ID_PRODUTO", nullable = false)
	private Produto produto;

	@Column(name = "VLR_PRODUTO", nullable = false, length = 10)
	private BigDecimal valorProduto;

	@Column(name = "PRC_COMISSAO_COORDENADOR", nullable = false, length = 10)
	private BigDecimal comissaoCoordenador;

	@Column(name = "PRC_COMISSAO_CAPTADOR", nullable = false, length = 10)
	private BigDecimal comissaoCaptador;

	@OneToMany(targetEntity = SubFormularioEntity.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "formulario")
	@JoinColumn(name = "ID_FORMULARIO", nullable = false)
	private List<SubFormulario> subFormularios;

	@Column(name = "VTR_DEPOSITO", nullable = false, length = 10)
	private BigDecimal valorDeposito;
	
	@Enumerated(EnumType.STRING)
	@Column(name = "STATUS", nullable = false, length = 2)
	private ControleProcessamento controleProcessamento = ControleProcessamento.NP;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Instituicao getInstituicao() {
		return instituicao;
	}

	public void setInstituicao(Instituicao instituicao) {
		this.instituicao = instituicao;
	}

	public Coordenador getCoordenador() {
		return coordenador;
	}

	public void setCoordenador(Coordenador coordenador) {
		this.coordenador = coordenador;
	}

	public List<SubFormulario> getSubFormularios() {
		return subFormularios;
	}

	public void setSubFormularios(List<SubFormulario> subFormularios) {
		this.subFormularios = subFormularios;
	}

	public ContaCorrente getContaCorrente() {
		return contaCorrente;
	}

	public void setContaCorrente(ContaCorrente contaCorrente) {
		this.contaCorrente = contaCorrente;
	}

	public BigDecimal getValorDeposito() {
		return valorDeposito;
	}

	public void setValorDeposito(BigDecimal valorDeposito) {
		this.valorDeposito = valorDeposito;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public BigDecimal getValorProduto() {
		return valorProduto;
	}

	public void setValorProduto(BigDecimal valorProduto) {
		this.valorProduto = valorProduto;
	}

	public BigDecimal getComissaoCoordenador() {
		return comissaoCoordenador;
	}

	public void setComissaoCoordenador(BigDecimal comissaoCoordenador) {
		this.comissaoCoordenador = comissaoCoordenador;
	}

	public BigDecimal getComissaoCaptador() {
		return comissaoCaptador;
	}

	public void setComissaoCaptador(BigDecimal comissaoCaptador) {
		this.comissaoCaptador = comissaoCaptador;
	}

	public ControleProcessamento getControleProcessamento() {
		return controleProcessamento;
	}

	public void setControleProcessamento(ControleProcessamento controleProcessamento) {
		this.controleProcessamento = controleProcessamento;
	}
	

}
